<?php
namespace common\component\tool;

use Yii;
/*
工具类
*/
class Tool
{
	/*
    返回客户端函数
    $args = array(
        '0'  返回码
        '1'  返回信息
    )
    $data  返回数据，一般为数组，比如获取信息列表信息的时候
    $url   返回链接，跳转链接，比如微信登录的时候
    */
    public static function showRes($args = [0, '操作成功'], $data = '', $url = '')
    {
        $res = array(
            'code' => $args[0],
            'info' => $args[1]
        );
        if(!empty($data)){
            $res['data'] = $data;
        }
        
        if(!empty($url)){
            $res['url'] = $url;
        }
        // return json_encode($res, JSON_UNESCAPED_UNICODE); 中文 生效
        return json_encode($res, 320);//JSON_UNESCAPED_UNICODE + JSON_UNESCAPED_SLASHES = 320  中文/ 同时生效
    }

    /*
    产生6位随机字符串
    $format  all全部 ， num 全部为数字
    */
    public static function generateRandomStr($length = 6, $format = 'all')
    { 
        // 密码字符集，可任意添加你需要的字符 
        if($format == 'num'){
            $chars = '0123456789'; 
        }else{
            $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; 
        }
        $randStr = ''; 
            for($i=0; $i<$length; $i++) { 
                // 这里提供两种字符获取方式 
                // 第一种是使用 substr 截取$chars中的任意一位字符； 
                // $randStr .= substr($chars, mt_rand(0, strlen($chars) – 1), 1); 
                // 第二种是取字符数组 $chars 的任意元素 
                $randStr .= $chars[mt_rand(0, strlen($chars)-1)];
            };
        return $randStr; 
    }

    /*获取每页显示多少条*/
    public static function getPageSize()
    {
        $pageSize = Yii::$app->params['pageSize'];
        $cookie = Yii::$app->request->cookies;
        if(isset($cookie['pageSize'])){
            $pageSizeByCookie = intval($cookie['pageSize']->value);
            if($pageSizeByCookie > 0){
                $pageSize = $pageSizeByCookie;
            }
        }
        return $pageSize;
    }

    /*
    布尔值 转 数字
    $v  需要转的值
    true 对应 2
    false 对应 1
    */
    public static function changeBool($v)
    {
        $res = '';
        if(!empty($v)){
            if($v == 'true'){
                $res = 2;
            }
            if($v == 'false'){
                $res = 1;
            }
        }
        return $res;
    }


    /*
    上传的图片格式为
    [
        {
            name: 'food.jpeg',
            url: 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg'
        },
        {
            name: 'girl.jpeg',
            url: 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1560679288329&di=172c2c82297e0370c719376481a3efd1&imgtype=0&src=http%3A%2F%2Fhbimg.b0.upaiyun.com%2Ff47f57c43ebfab555a3e42938d75afc8540b1a3d34124-CXO8Sg_fw658'
        }
    ]
    把上面的是个改成下面的格式
    [
        url: 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg',
        url: 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1560679288329&di=172c2c82297e0370c719376481a3efd1&imgtype=0&src=http%3A%2F%2Fhbimg.b0.upaiyun.com%2Ff47f57c43ebfab555a3e42938d75afc8540b1a3d34124-CXO8Sg_fw658'
    ]
    */
    public static function changeUploadFormat($arr)
    {
        $res = [];
        if(is_array($arr)){
            for($i=0; $i<count($arr); $i++){
                $res[$i] = isset($arr[$i]['url'])?$arr[$i]['url']:"";
            }
        }
        if(!empty($res)){
            return implode(',', $res);
        }
        return $res;
    }


    /*返回当前的毫秒时间戳*/
    public static function getMsectime() {
        list($msec, $sec) = explode(' ', microtime());
        $msectime = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
        return $msectime;
    }


    /*
    操作日志通用参数
    $backInfo['返回码', '返回信息']
    */
    public static function operationLogArgs($backInfo = ['', ''], $userInfo = [], $memberInfo = [])
    {
        $loginid = '';
        $loginname = '';
        $comid = '';
        if($userInfo){
            $loginid = isset($userInfo['admin_id'])?$userInfo['admin_id']:'';
            $loginname = isset($userInfo['username'])?$userInfo['username']:'';
            $comid = isset($userInfo['comid'])?$userInfo['comid']:'';
        }
        if($memberInfo){
            $loginid = isset($memberInfo->member_id)?$memberInfo->member_id:'';
            $loginname = isset($memberInfo->loginname)?$memberInfo->loginname:'';
            $comid = isset($memberInfo->comid)?$memberInfo->comid:'';
        }
        $args = array(
            'loginid' => $loginid,
            'loginname' => $loginname,
            'comid' => $comid,
            'back_code' => $backInfo[0],
            'back_info' => $backInfo[1]
        );
        return $args;
    }


    /*文件目录相关操作>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
    /*某个文件夹里的 文件列表*/
    public static function dirList($dir){
        $fileModifyTimeList = [];//文件的修改时间，用户排序
        $dirList = [];//最终返回的结果
        if(empty($dir) or !file_exists($dir)){
            return $dirList;
        }
        // P(file_exists($dir));
        $dir = iconv('utf-8', 'gb2312', $dir);//避免中文文件无法读取，强制转换
        $handler = opendir($dir);//打开文件夹
        while(($filename = readdir($handler)) !== false)
        {
            if($filename != '.' && $filename != '..')
            {
                // echo $filename;
                // $gbfilename = mb_convert_encoding($filename, 'utf-8', 'gb2312');//用于显示中文目录
                $gbfilename = $filename;//用于显示中文目录
                // echo $gbfilename."<br>";
                array_push($fileModifyTimeList, filemtime($dir.'/'.$filename));//放入修改时间数组里，用于排序
                if(is_dir($dir.'/'.$filename))//如果存在，并且是 文件夹 的话
                {
                    array_push($dirList, [
                        'fileName' => $gbfilename,//文件夹名称
                        'dir' => ($dir.'/'.$filename),//文件夹目录
                        'lastModifyTime' => filemtime($dir.'/'.$filename),//文件夹最后修改时间 
                        'size' => self::convertFileUnit(self::dirSize($dir.'/'.$filename)),//文件夹大小
                        'fileCount' => self::dirFiles($dir.'/'.$filename),//文件夹包含文件总数
                        'flag' => 1//1代表是文件夹
                    ]);
                }else{
                    array_push($dirList, [
                        'fileName' => $gbfilename,//文件名称 
                        'dir' => $dir,//文件目录
                        'lastModifyTime' => filemtime($dir.'/'.$filename),//文件最后修改时间 
                        'size' => self::convertFileUnit(filesize($dir.'/'.$filename)),//文件大小
                        'fileCount' => 0,//文件夹包含文件总数
                        'flag' => 0//0代表是文件
                    ]);
                }
            }
        }
        array_multisort($fileModifyTimeList, SORT_NUMERIC, SORT_DESC, $dirList);//按时间倒叙排序
        // P($dirList);

        return $dirList;

    }

    //统计目录下所有文件的容量
    public static function dirSize ($dir)
    {
        $dh = opendir($dir);             //打开目录，返回一个目录流
        $size = 0;      //初始大小为0 
        while(false !== ($file = @readdir($dh))){     //循环读取目录下的文件
            if($file != '.' and $file != '..'){
                $path = $dir.'/'.$file;     //设置目录，用于含有子目录的情况
                // echo $path."<br>";
                if(is_dir($path)){
                    $size += self::dirSize($path);  //递归调用，计算目录大小
                }elseif(is_file($path)){
                    $size += filesize($path);   //计算文件大小
                }
            } 
        }   
        closedir($dh);             //关闭目录流
        return $size;               //返回大小
    }


    /*统计目录下共有多少个文件*/
    public static function dirFiles($dir)
    {
        $num = 0;//造一个变量，让他默认值为0;
        $arr = glob($dir);//把该路径下所有的文件存到一个数组里面;
        foreach ($arr as $v)//把数组$arr赋给$v;
        {
            if(is_file($v)){//先用个if判断一下这个文件夹下的文件是不是文件，有可能是文件夹;
                $num ++;//如果是文件，数量加一;
            }else{
                $num += self::dirFiles($v . "/*");//如果是文件夹，那么再调用函数本身获取此文件夹下文件的数量，这种方法称为递归;
            }
        }
        return $num;//当这个方法走完后，返回一个值$sl,这个值就是该路径下所有的文件数量;
    }


    /*
    文件大小 单位转换
    $filesize   文件大小
    */
    public static function convertFileUnit($filesize)
    {
        if($filesize >= 1073741824) {
            $filesize = round($filesize / 1073741824 * 100) / 100 . ' GB';
        } else if($filesize >= 1048576) {
            $filesize = round($filesize / 1048576 * 100) / 100 . ' MB';
        } else if($filesize >= 1024) {
            $filesize = round($filesize / 1024 * 100) / 100 . ' KB';
        } else {
            $filesize = $filesize . ' Byte';
        }
        return $filesize;
    }
    /*文件目录相关操作<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/



    /*上传的图片，根据规则返回对应尺寸的图片路径>>>>>>>>>>>>>>*/
    /*
    根据原始图片路径 和 不同尺寸的数量，返回对应的尺寸路径
    $path       图片路径
    $diffsize    图片有多个尺寸
    $size       需要返回的尺寸
    */
    public static function getAlbumBySizenum($path, $diffsize, $size='big')
    {
        $size = $size.'_img';
        $allSize = Yii::$app->params['imgSize'];//所有配置尺寸
        /*需要的尺寸，在所有尺寸的位置*/
        $index = 0;
        foreach($allSize as $k => $v){
            $index++;
            if($k == $size){
                break;
            }
        }
        if(($index == 0) or ($diffsize < $index)){//如果需要的尺寸没有的话，直接返回原始图片路径
            return $path;
        }
        $arr = explode('.', $path);
        $suffix = array_slice($arr, -1, 1)[0];//后缀
        $prefix = str_ireplace('origin', $allSize[$size], $arr[0]);//把路径中的'origin'换成对应的文件夹名称
        return $prefix . '!!' . $diffsize . '_' . $allSize[$size] . 'x' . $allSize[$size] . '.' . $suffix;
    }


    /*上传的图片，根据规则返回对应尺寸的图片路径<<<<<<<<<<<<<<*/

    public static function isMobile()
    {
        //如果有HTTP_X_WAP_PROFILE则一定是移动设备
        if(isset($_SERVER['HTTP_X_WAP_PROFILE']))  return TRUE;

        //如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息
        if(isset($_SERVER['HTTP_VIA']))
        {
            //找不到为flase,否则为true
            return stristr($_SERVER['HTTP_VIA'], "wap") ? true : false;
        }

        //判断手机发送的客户端标志,兼容性有待提高
        if(isset($_SERVER['HTTP_USER_AGENT']))
        {

            $clientkeywords = array('nokia','sony','ericsson','mot','samsung','htc','sgh','lg','sharp','sie-','philips','panasonic','alcatel','lenovo','iphone','ipod','blackberry','meizu','android','netfront','symbian','ucweb','windowsce','palm','operamini','operamobi','openwave','nexusone','cldc','midp','wap','mobile');

            //从HTTP_USER_AGENT中查找手机浏览器的关键字
            if(preg_match('/('.implode('|', $clientkeywords).')/i', strtolower($_SERVER['HTTP_USER_AGENT'])))
            {
                return TRUE;
            }
        }

        //协议法，因为有可能不准确，放到最后判断
        if(isset($_SERVER['HTTP_ACCEPT']))
        {
            //如果只支持wml并且不支持html那一定是移动设备
            //如果支持wml和html但是wml在html之前则是移动设备
            if((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) &&
               (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false ||
               (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html'))))
            {
                    return TRUE;
            }
        }

        return FALSE;
    }

}